package com.yang.mall.exception;


import com.yang.mall.enums.ResponseEnum;
import com.yang.mall.vo.ResponseVo;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Objects;

import static com.yang.mall.enums.ResponseEnum.ERROR;

// 结合方法型注解@ExceptionHandler，用于捕获Controller中抛出的指定类型的异常
@ControllerAdvice
public class RuntimeExceptionHandle {
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
/*
    @ResponseStatus(HttpStatus.ACCEPTED)
    该注解可以用来改变返回的HTTP连接状态码
*/
    public ResponseVo handle(RuntimeException e) {
        return ResponseVo.error(ERROR, e.getMessage());
    }

    @ExceptionHandler(UserLoginException.class)
    @ResponseBody
    public ResponseVo userLoginHandle() {
        return ResponseVo.error(ResponseEnum.NEED_LOGIN);
    }

    /*
    * 用作同意参数验证，因为当访问后端时，可能会携带参数，如果携带的参数不对或者没有携带参数，那么spring会抛出对应的异常，我们可以通过捕获这个异常来进行参数处理
    ***/
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ResponseVo notValidExceptionHandle(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        Objects.requireNonNull(bindingResult.getFieldError());
        return ResponseVo.error(ResponseEnum.PARAM_ERROM,
                bindingResult.getFieldError().getField() + " " + bindingResult.getFieldError().getDefaultMessage());
    }
}
